import axios from "axios";
import getTime from "./getTime";

/**
 * 将 Date 对象格式化为 yyyy、mm、dd 部分，考虑到 Asia/Shanghai 时区
 * @param date Date 对象
 * @returns { year: string, month: string, day: string } - 格式化后的日期部分
 */
function formatToBeijingTime(date: Date): { year: string; month: string; day: string } {
    // 转换为北京时间
    const beijingOffset = 8 * 60; // 北京时间相对于 UTC 的偏移分钟
    const utc = date.getTime() + date.getTimezoneOffset() * 60 * 1000;
    const beijingTime = new Date(utc + beijingOffset * 60 * 1000);

    // 使用 Date 对象方法提取年月日
    const year = beijingTime.getFullYear().toString();
    const month = (beijingTime.getMonth() + 1).toString().padStart(2, '0'); // 月份从 0 开始
    const day = beijingTime.getDate().toString().padStart(2, '0');
    return { year, month, day };
}

/**
 * 检查所给日期是否需要上班。
 * @param inputDate Date 对象或 yyyy-mm-dd 格式的字符串。
 * @param api  https://www.tianapi.com/
 * @returns Promise<boolean> - 如果需要上班，返回 true；否则返回 false。
 */
async function isWorkday(inputDate: Date | string, api?: string): Promise<boolean> {
    if ( !api ) {
        console.log(
            `${getTime()}`,
            `未设置节假日查询api, 自动跳过节假日验证`
        )
        return true;
    }
    try {
        let date: string;

        // 确保日期是 yyyy-mm-dd 格式的字符串
        if (typeof inputDate === "string") {
            // 统一处理 yyyy/mm/dd 为 yyyy-mm-dd
            date = inputDate.replace(/\//g, "-");
        } else {
            // 如果是 Date 对象，转换为 yyyy-mm-dd 格式
            const { year, month, day } = formatToBeijingTime(inputDate);
            date = `${year}-${month}-${day}`;
        }

        const apiUrl = `https://apis.tianapi.com/jiejiari/index?key=${api}&date=${date}`;

        // 调用 API
        const response = await axios.get(apiUrl);

        // 检查 API 响应
        if (response.data.code !== 200) {

            console.log(date)
            console.log(apiUrl)
            console.log(response)
            throw new Error(`API 错误: ${response.data.msg}`);
        }

        const result = response.data.result;
        // console.log(result);
        // 如果没有结果或列表为空，认为日期有效但无法确定是否上班，默认返回 false
        if (!result || !result.list || result.list.length === 0) {
            return false;
        }

        // 获取第一条记录的 isnotwork 字段
        const isNotWork = result.list[0].isnotwork;

        // 如果 isnotwork 为 0，表示需要上班
        return isNotWork === 0;
    } catch (error) {
        // 出现错误时默认返回 true
        console.log(error);
        return true;
    }
}


export default isWorkday;

// // 示例用法
// (async () => {
//     const day = new Date(); // 当前日期
//     console.log(formatToBeijingTime(day))
//     // const result = await isWorkday(day);
//     // console.log(`是否需要上班: ${result}`);
// })();
